function funcNew(obj, ...args) {
    const newObj = Object.create(obj.prototype);
    const result = obj.apply(newObj, args);
    return (typeof result === 'object' && result !== null) ? result : newObj;
}

function newFactory() {
    let obj = new Object();
    const Constructor = [].shift.call(arguments);
    obj.__proto__ = Object.create(Constructor.prototype);
    const result = Constructor.apply(obj, arguments);
    const isObject = typeof result === "object" && result !== null;
    const isFunction = typeof result === "function";
    return isObject || isFunction ? result : obj;
}

/**
 * 1. 首先函数接受不定量的参数，第一个参数为构造函数，接下来的参数被构造函数使用
2. 然后内部创建一个空对象 obj
3. 因为 obj 对象需要访问到构造函数原型链上的属性，所以我们通过 setPrototypeOf 将两者联系起来。这段代码等同于 obj.__proto__ = Con.prototype
4. 将 obj 绑定到构造函数上，并且传入剩余的参数
5. 判断构造函数返回值是否为对象，如果为对象就使用构造函数返回的值，否则使用 obj，这样就实现了忽略构造函数返回的原始值
 */
function createNew(Con, ...args) {
    let obj = {} // 创建一个对象，因为new操作符会返回一个对象
    Object.setPrototypeOf(obj, Con.prototype) // 将对象与构造函数原型链接起来
    // obj.__proto__ = Con.prototype // 等价于上面的写法
    let result = Con.apply(obj, args) // 将构造函数中的this指向这个对象，并传递参数
    return result instanceof Object ? result : obj
}

var a = function () {
    this.name = "bigyoung"
    return { 'name': 'woqu' }
}
a.prototype.showName = function () {
    console.log(this.name);
}

var b = new a
console.log(b);